package com.niit.scala

/**
 * Date:2025/3/14
 * Author：Ys
 * Description:
 */
object Base05 {

  /*
     Java:
       class Person{

          构造器的作用：当创建对象的时候，会自动调用构造器，在构造器中进行初始化。构造器是与生俱来的的方法。
           构造器分为两种 ： 有参数构造器  无参构造器
           public Person(参数列表){}
       }
   */
   /*
     Scala：
       定义主构造器：
          格式 class 类名(var/val 参数名:参数类型,var/val 参数名:参数类型=默认值)
       辅助构造器：辅助构造器的方法名必须叫this
                格式 def this(参数列表){
                     //第一行必须调用主构造器
                  }
    */
  class Person(var name:String,var age:Int=18) {
      def this(arr:Array[String]){//参数为数组也可以为其他类型
          this("王五",66) //第一行必须调用主构造器
          println("辅助构造器",arr(0),arr(1))

      }
  }


  /*
   在Scala是没有static，如果想使用静态的东西只能定义单例对象
   object 对象名{}
   调用：对象名.属性
   */

  object Dog{
    val leg_num = 4
    def eat(){
      println("狗吃狗粮")
    }
  }

  /*
    在Java中，类里面可以定义成员变量和静态变量以及成员方法和静态方法，如果想在Scala中使用静态的东西，就用要用到 伴生对象
     一个class和一个object的名字是相同的，那么就做伴生。object为class的伴生对象，class为object的伴生类
     并且这个class和object必须在同一个文件当中
     伴生对象和伴生类可以相互访问private属性
   */
  class Generals{
    def gan(): Unit = {
      println("士兵拿着"+Generals.armsName)
      //Generals.arms()
    }
  }
  //↑ 互为伴生 ↓
  object Generals{
    private var armsName = "大刀"
    //private [this] 修饰符，表示这个方法只能在伴生对象内部调用
    private [this] def arms(){
      println("手握"+armsName)
    }
    //apply()方法，免去 new的方式的进行实例化
    //在伴生对象中进行实例化
    def apply(): Generals = new Generals()
  }

  def main(args: Array[String]): Unit = {
    val p = new Person("Tom",23)
    println(p.name,p.age)
    val pp = new Person(Array("张三","男"))

    println(Dog.leg_num)
    Dog.eat()

    val generals = new Generals()
    generals.gan()

    val generals1 = Generals()
  }
}
